{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 线程池的使用"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 项目定位：线程池是一个库而非中间件，需要嵌入应用程序中使用，最终以动态库方式提供\n",
    "- 编译方式：通过简单命令编译成动态库，类似MySQL的libmysqlclient.so使用方式"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "基本使用流程\n",
    "\n",
    "- 对象创建：`ThreadPool pool;` 创建线程池对象\n",
    "- 模式设置：\n",
    "  - 默认fixed模式（固定线程数量）\n",
    "  - 可选cached模式（线程动态增长）\n",
    "  - 通过`pool.setMode()`方法设置\n",
    "- 启动方式：`pool.start()`非阻塞启动，立即返回不影响主线程执行"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "任务提交机制\n",
    "\n",
    "- 任务提交：`Result result = pool.submitTask(concreteTask)`\n",
    "  - 支持任意类型任务提交\n",
    "  - 返回`Result`对象用于获取执行结果\n",
    "- 执行方式：\n",
    "  - 线程池自动分配线程执行\n",
    "  - 对不需要结果的场景可忽略返回值"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "结果获取机制\n",
    "\n",
    "- 类型安全：使用C++17的`any`类型封装返回结果\n",
    "- 获取方法：`result.get().Cast<结果类型>()`\n",
    "  - 调用方需明确知道返回类型\n",
    "  - 支持任意类型结果转换\n",
    "- 实现原理：\n",
    "  - 基于任务队列（最大阈值1024）\n",
    "  - 使用`mutex+condition_variable`保证线程安全\n",
    "  - 包含`notFull/notEmpty`条件变量控制"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "设计要点\n",
    "\n",
    "- 任务队列：采用线程安全的任务列表管理待执行任务\n",
    "- 线程管理：\n",
    "  - fixed模式保持固定线程数\n",
    "  - cached模式根据负载动态增减线程\n",
    "- 同步机制：\n",
    "  - 基于C++20的`semaphore`实现同步\n",
    "  - 条件变量处理队列空/满状态\n",
    "- 扩展性：通过虚函数`virtual void run()=0`支持不同任务类型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 线程池的内部"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "线程池的组成 \n",
    "\n",
    "![10.1](./images/10.1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 线程容器：需要容器存储线程对象，抽象`Thread`类表示线程\n",
    "- 线程模式：支持fixed(固定数量)和cached(动态增长)两种模式\n",
    "- 任务队列：需要线程安全容器存储待执行任务，考虑任务堆积上限\n",
    "- 通信机制：使用`mutex+condition variable`实现线程间同步"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "线程数量管理\n",
    "\n",
    "- 数量控制：需要变量记录当前线程数和最大线程数上限\n",
    "- 创建限制：线程过多会导致：\n",
    "  - 内存消耗大（每个线程栈占用内存）\n",
    "  - 上下文切换开销超过实际任务执行时间\n",
    "  - 条件满足时可能唤醒过多线程导致系统崩溃\n",
    "- 动态调整：cached模式根据任务量动态增减线程数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "任务队列管理\n",
    "\n",
    "- 线程安全：需考虑多线程同时存取任务的同步问题\n",
    "- 容量限制：设置任务数阈值（如1万-2万），防止内存耗尽\n",
    "- 提交反馈：当队列满时，submitTask应返回任务提交失败状态\n",
    "- 生产者-消费者：外部线程生产任务，池内线程消费任务"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "任务的多态性设计\n",
    "\n",
    "- 抽象基类：提供Task基类含纯虚函数`virtual void run()=0`\n",
    "- 多态实现：用户自定义任务需继承`Task`并重写`run`方法\n",
    "- 通用接口：线程池通过基类指针接收各种具体任务对象\n",
    "- 智能指针：建议使用智能指针管理任务和线程对象"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "线程间通信与同步\n",
    "\n",
    "- 同步原语：必须使用`mutex`保护共享任务队列\n",
    "- 条件变量：实现`notEmpty`(队列非空)和`notFull`(队列未满)两种状态\n",
    "- 等待机制：\n",
    "  - 队列空时消费线程等待`notEmpty`条件\n",
    "  - 队列满时生产线程等待`notFull`条件\n",
    "- C++新特性：可结合C++17的`any`和C++20的`semaphore`实现"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "项目整体架构与实现思路\n",
    "\n",
    "- 分层设计：\n",
    "  - `ThreadPool`管理线程生命周期\n",
    "  - `Task`抽象任务执行逻辑\n",
    "  - `Thread`封装线程对象\n",
    "- 迭代开发：从简单实现开始逐步优化\n",
    "- 异常处理：需考虑任务执行异常的处理机制\n",
    "- 性能权衡：在任务吞吐量和系统资源消耗间取得平衡"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "C++17",
   "language": "C++17",
   "name": "xcpp17"
  },
  "language_info": {
   "name": "C++17"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
